/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 沈明月
 * Date: 2022-11-27
 * Time: 10:57
 */


//成员变量：方法的外面，类的里面
//局部变量：方法的里面

//this引用：（this不能调用静态的成员方法和属性）
//this.data：访问当前对象的成员变量
//this.func()：访问当前对象的成员方法
//this()：调用当前对象的其他成员方法


//用法一：访问成员变量
/*
public class DateUtil {
    public int year;
    public int month;
    public int day;

    public void setDate(int y,int m,int d){
//上面这行代码应该是这么写的public void setDate(DateUtil this, int y,int m,int d){
//只是DateUtil this 一般会省略不写，this的类型是DateUtil，this指的就是调用这个方法的对象

        this.year = y;
        this.month = m;
        this.day = d;
    }
//要习惯使用this，原因：
*/
/*//*
/试想，如果上面的代码是这样的形式
public void setDate(int year,int month,int day){
    year = year;
    month = month;
    day = day;
    //局部变量优先使用
    //那么在赋值的时候，（以dateUtil1为例）会把2022，11，27分别传给year,month,和day，
    //但是只是给setDate方法里的局部变量year,month,和day，赋值，而不是给dateUtil1这个对象里的year,month,和day赋值
    //所以最好是加上this.来指明
}*//*

    public void show(){
        System.out.println("年："+this.year+" 月："+this.month+" 日："+this.day);
    }

    public static void main(String[] args) {
        DateUtil dateUtil1 = new DateUtil();
        dateUtil1.setDate(2022,11,27);
        dateUtil1.show();//年：2022 月：11 日：27

        DateUtil dateUtil2 = new DateUtil();
        dateUtil2.setDate(2022,11,28);
        dateUtil2.show();//年：2022 月：11 日：28

        DateUtil dateUtil3 = new DateUtil();
        dateUtil3.setDate(2022,11,29);
        dateUtil3.show();//年：2022 月：11 日：29

        //三个对象都在调用setDate,如何确保它们的对应关系没有出错
    }
}
*/



/*public class DateUtil {
    public int year;
    public int month;
    public int day;

    public DateUtil(){
        System.out.println("不带参数的构造方法！");
        //如果没有写,Java会默认提供一个不带参数的构造方法
        //如果写了，就会调用你自己的构造方法
    }
    public DateUtil(int year,int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void show(){
        System.out.println("年："+this.year+" 月："+this.month+" 日："+this.day);
    }

    public static void main(String[] args) {
        DateUtil dateUtil1 = new DateUtil();//这里是实例化对象，此时会调用构造方法
        //何为构造方法：
        //方法没有返回值，方法名和类名是一样的
        //只会在实例化对象的时候调用一次，其他时候不调用
        //构造方法可以重载

        dateUtil1.setDate(2022,11,27);
        dateUtil1.show();//年：2022 月：11 日：27

        DateUtil dateUtil2 = new DateUtil();
        dateUtil2.setDate(2022,11,28);
        dateUtil2.show();//年：2022 月：11 日：28

        DateUtil dateUtil3 = new DateUtil();
        dateUtil3.setDate(2022,11,29);
        dateUtil3.show();//年：2022 月：11 日：29

    }
}*/



/*public class DateUtil {
    public int year;
    public int month;
    public int day;

//带参数的构造方法：
    public DateUtil(int year,int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了带有三个参数的构造方法！");
    }
    //这个构造方法和上面不带参数的构造方法构成重载（方法名必须相同，参数列表不同，返回值没有影响）
    public void setDate(int y,int m,int d){
        this.year = y;
        this.month = m;
        this.day = d;
    }

    public void show(){
        System.out.println("年："+this.year+" 月："+this.month+" 日："+this.day);
    }

    public static void main(String[] args) {
        //有了带参数的构造方法以后，就可以直接在实例化对象的时候对对象进行赋值
        DateUtil dateUtil1 = new DateUtil(2022,11,27);
        dateUtil1.show();//年：2022 月：11 日：27

        DateUtil dateUtil2 = new DateUtil(2022,11,28);
        dateUtil2.show();//年：2022 月：11 日：28

        DateUtil dateUtil3 = new DateUtil(2022,11,29);
        dateUtil3.show();//年：2022 月：11 日：29
    }
}*/



//用法二：访问构造方法：
/*public class DateUtil {
    public int year;
    public int month;
    public int day;

//不带参数的构造方法：
    public DateUtil(){
        this(1999,9,9);//这个this引用会调用当前对象的其他构造方法
        //this去调用构造方法的时候必须放在第一行，只能在构造方法里这么使用
        System.out.println("不带参数的构造方法！");
    }
//带参数的构造方法：
    public DateUtil(int year,int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了带有三个参数的构造方法！");
    }

//上面的this引用不能这么写：死循环
*//*    //不带参数的构造方法：
    public DateUtil(){
        this(1999,9,9);
        System.out.println("不带参数的构造方法！");
    }
    //带参数的构造方法：
    public DateUtil(int year,int month, int day){
        this();//上面的两个构造方法不能这么写，this引用会成环，出不来
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了带有三个参数的构造方法！");
    }*//*
    public void setDate(int y,int m,int d){
        this.year = y;
        this.month = m;
        this.day = d;
    }

    public void show(){
        System.out.println("年："+this.year+" 月："+this.month+" 日："+this.day);
    }

    public static void main(String[] args) {
        //有了带参数的构造方法以后，就可以直接在实例化对象的时候对对象进行赋值
        DateUtil dateUtil1 = new DateUtil();
        dateUtil1.show();
        //从输出也可以看出这个代码的运行情况是如何
    }
}*/




//用法三：访问成员方法
/*
public class DateUtil {
    public int year;
    public int month;
    public int day;

    public void setDate(int y,int m,int d){
        this.year = y;
        this.month = m;
        this.day = d;
        this.show();//访问成员方法
    }

    public void show(){
        System.out.println("年："+this.year+" 月："+this.month+" 日："+this.day);
    }

    public static void main(String[] args) {
        DateUtil dateUtil1 = new DateUtil();
        //检测对象对应的类是否加载了，如果没有加载则加载
        //为对象分配内存
        //处理并发安全问题
       //初始化所分配的空间
       //设置对象头信息
        dateUtil1.setDate(2022,11,27);//年：2022 月：11 日：27
    }
}*/



//就地初始化：在声明变量的同时直接就给出了初始值
/*public class DateUtil {
    public int year = 1999;
    public int month = 12;
    public int day = 11;
}*/









